package god;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class J21HelloJDBC {

	// JDBC : Java DataBase COnnectivity
	// 외부 라이브러리 등록	JavaPro - 우클릭 - Build Path - Add External Archives 클릭 후 JDBC 파일 선택
	
	// while 부분 외의 나머지 부분은 매번 같은 형식으로 사용됨. 이것만 알아도 JDBC의 80% 정도는 할 수 있음
	public static void main(String[] args) {
		
		// 데이터베이스에 접속 하려면 환경변수를 지정해야한다
		String DRV = "oracle.jdbc.driver.OracleDriver";						// 필수
		String URL = "jdbc:oracle:thin:@127.0.0.1:1521:xe";				// IP주소 대신 localhost 가능
		String USR = "scott";
		String PWD = "TIGER";
		
		// 일반적으로 사용하는 JDBC API
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;																	// SQL문 실행 후 결과를 담아내기 위한 객체. ArrayList랑 비슷
		
		String sql = "select * from emp";
		
		try {
			// 1. JDBC 드라이버 로드
			// forName 메서드로 동적으로 객체 생성
			Class.forName(DRV);
			
			// 2. 데이터베이스 연결
			// getConnection 메서드에 접속 정보가 있는 URL과
			// 계정 정보 및 암호인 USR, PWD를 매개변수로 넘김
			conn = DriverManager.getConnection(URL, USR, PWD);
			System.out.println("오라클 서버 접속 성공");
			
			// 3. 실행할 SQL 질의문 생성
			// SQL 질의문은 String 변수에 작성 PrepareStatement 메서드를 통해 PrepareStatement 객체로 생성
			// statement, prepareStatement 두가지 있음
			pstmt = conn.prepareStatement(sql);									// 현재 접속된 DB의 정보 = conn에 있음. 그 안에서 질의문 생성
	
			// 4. SQL문 실행
			// excuteQuery 메서드로 실행할 수 있음
			// 5. 실행 결과 집합 받기
			// SQL 질의문이 select라면 실행 후 결과 집합이 발생됨. 이것을 받으려면 ResultSet 객체를 이용 
			rs = pstmt.executeQuery();
			
			StringBuilder sb = new StringBuilder();
			
			// 6. 결과 처리
			// next 메서드로 결과 행 존재 여부를 확인하고 getString 메서드로 해당 필드값을 출력
			while (rs.next()) {																													// 숫자 : 간편. 편리.     컬럼명 : 가독성 좋음
				sb.append(rs.getString(1)).append("/").append("ename").append("\n");							// 필드이름 (컬럼명) 이나 숫자로 출력할 데이터행 선택.
			}																																				//  컬럼 순서대로 1~ 숫자가 나감.
			System.out.println(sb);
		} catch (java.lang.ClassNotFoundException cnfe) {
			System.out.println("JDBC 드라이버를 확인하세요.");
		} catch(Exception ex) {
			ex.printStackTrace();
			
			// 7. 연결 해제
			// JDBC 프로그래밍에 사용된 모든 객체들을 메모리에서 해제
			// 나중에 실행된 객체부터 순서대로 닫아줌
		} finally {																						// 지금까지 사용한 자원 반납
			if (rs != null)
				try {rs.close(); } catch(Exception e) {}
			if (pstmt != null)
				try {pstmt.close(); } catch(Exception e) {}
			if (conn != null)
				try {conn.close(); } catch(Exception e) {}
		}
	}

}
